#include <iostream>
#include <vector>
#include <string>
#include <cmath>

#include "SimulatedAnnealing.h"
#include "HetmansProblem.h"

using namespace std;

/**
 * Funkcja ta rozwiązuje problem podaną ilość razy i wyświetla statystyki,
 * czyli ilość powodzeń, średnią ilość iteracji przy rozwiązanym problemie
 * i złożoność, z jaką rozwiązany byłby problem metodą brute force
 * 
 * @param state_size ile pól ma szachownica / ile jest hetmanów
 * @param iterations ile razy ma być powtórzony eksperyment
 * @param temperature_start początkowa temperatura
 * @param temperature_interval o ile temperatura ma spadać w każdej iteracji
 */
void test ( int state_size, int iterations, float temperature_start, float temperature_interval );

int main ( int argc, char **argv ) {
    srand ( time ( NULL ) );
    test ( 6, 100, 800, 0.002 );
    return 0;
}

void test ( int state_size, int iterations, float temperature_start, float temperature_interval ) {
    int solvedCounter = 0;
    long iterationsCounter = 0;
    for ( int i = 0; i < iterations; i++ ) {
        HetmansProblem problem ( state_size );
        SimulatedAnnealing sa;
        sa.setProblem ( &problem );
        vector<float> temperatures;
        SimulatedAnnealing::generateTemperatures ( temperatures, temperature_start, temperature_interval );
        sa.setTemperatures ( temperatures );
        sa.simulate();
        if ( problem.isSolved() ) {
            solvedCounter++;
            iterationsCounter += sa.getIterations();
        }
    }
    cout << "Rozwiązano " << solvedCounter << "/" << iterations << endl
         << "Średnia ilość iteracji " << ( float ) iterationsCounter / solvedCounter << endl
         << "Ilość iteracji metodą brute force " << pow ( state_size, state_size ) << endl;
}
